package com.wcj.stack;


import java.util.ArrayList;
import java.util.List;

/**
 * 设计一个支持 push ，pop ，top 操作，并能在常数时间内检索到最小元素的栈。
 *
 * 实现 MinStack 类:
 *
 * MinStack() 初始化堆栈对象。
 * void push(int val) 将元素val推入堆栈。
 * void pop() 删除堆栈顶部的元素。
 * int top() 获取堆栈顶部的元素。
 * int getMin() 获取堆栈中的最小元素。
 */
public class 最小栈 {

    public static void main(String[] args) {
        MinStack minStack = new 最小栈.MinStack();
        minStack.push(512);
        minStack.push(-1024);
        minStack.push(-1024);
        minStack.push(512);
        minStack.pop();
        minStack.getMin();
        minStack.pop();
        minStack.getMin();
        minStack.pop();
        minStack.getMin();

    }

    static class MinStack {
        private List<Integer> data;               // store elements
        private Integer minEle = Integer.MAX_VALUE;

        public MinStack() {
            data = new ArrayList<>();
        }

        public void push(int val) {
            if (val < minEle){
                minEle = val;
            }
            data.add(val);
        }

        public void pop() {
            if (data.size() - 1 >= 0){
                Integer integer = data.get(data.size() - 1);
                data.remove(data.size() - 1);
                if (integer.equals(minEle)){
                    minEle = Integer.MAX_VALUE;
                    for (int i = 0; i < data.size(); i++){
                        if (data.get(i) < minEle){
                            minEle = data.get(i);
                        }
                    }
                }
            }
        }

        public int top() {
            return data.get(data.size() - 1);
        }

        public int getMin() {
            return minEle;
        }
    }
}
